# https://oapi.dingtalk.com/robot/send?access_token=3d4d133e402654fc03ac28a83f1757338e55c4fe9dfeb9c120eab194e2bc30e3
# SECd6b0a90feeeeba9c11f2d5435bef3b09f34d6c06e5adf72d7a15076e6d9c9917

#python 3.8
import time
import hmac
import hashlib
import base64
import urllib.parse

import requests


class DingRobotPull:
    def generater_sign(self):
        """
        加签
        加签的方式是钉钉机器人与开发者双向进行安全认证，以此来验证安全性。具体加签计算步骤如下：
        将时间戳 timestamp 和密钥 secret 当做签名字符串，使用HmacSHA256算法计算签名，然后进行Base64 encode，最后再把签名参数再进行urlEncode，得到最终的签名（需要使用UTF-8字符集）。

        参数
        timestamp
        开发者服务内当前系统时间戳，单位是毫秒，与请求调用时间误差不能超过1小时。
        secret
        密钥，机器人安全设置页面，加签一栏下面显示的SEC开头的字符串。
        """

        timestamp = str(round(time.time() * 1000))
        # 钉钉机器人唯一密钥
        secret = 'SECd6b0a90feeeeba9c11f2d5435bef3b09f34d6c06e5adf72d7a15076e6d9c9917'
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(timestamp, secret)
        string_to_sign_enc = string_to_sign.encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
        sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
        return timestamp,sign

    def send_ding_msg(self,content,at_all=True):
        timestamp,sign=self.generater_sign()
        url=f'https://oapi.dingtalk.com/robot/send?access_token=3d4d133e402654fc03ac28a83f1757338e55c4fe9dfeb9c120eab194e2bc30e3&timestamp={timestamp}&sign={sign}'
        header={'Content-type':'application/json;charset=utf-8'}
        req_json={
            'msgtype':'text',
            'text':{
                'content':content
            },
            'at':{
                'isAtAll':at_all
            }
        }
        res=requests.post(url=url,headers=header,json=req_json)
        return res.text
if __name__ == '__main__':
    dr=DingRobotPull()
    content="""
    大家好,我是小破詹
    """
    print(dr.send_ding_msg(content=content))
